package core.vols;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Hashtable;

import time.Heure;

import map.Airport;

import core.Avion;


public class PlanDeVol {
        
        private Hashtable<Integer, VolInstance> tableVol;
        private ArrayList<VolInstance> listeVol;
        private Avion avion;
        
        /**
         * @param listeVol
         */
        public PlanDeVol(Avion a, ArrayList<VolInstance> listeVol) {
                super();
                this.listeVol = listeVol;
                avion = a;
                tableVol = new Hashtable<Integer, VolInstance>();
                majTable();
        }
   
        private void majTable() {
                if(!tableVol.isEmpty()) tableVol.clear();
                for(int i=0;i<listeVol.size();i++) {
                        tableVol.put(listeVol.get(i).getNumero(), listeVol.get(i));
                }
        }
        
        public void decalerTousLesVols(Heure duree) {
        	for(int i=0;i<listeVol.size();i++) {
        		listeVol.get(i).decalerVol(duree);
        	}
        }
        
        public VolInstance getVolIndice(int i) {
        	return listeVol.get(i);
        }
        
        public void addVol(VolInstance v) {
        	listeVol.add(v);
        	Collections.sort(listeVol);
        	tableVol.put(v.getNumero(), v);
        }
        
        /** Regarde si un vol est prévu à la plage horaire demandée
         * 30min sont nécessaire avant que l'avion puisse repartir après un aterrissage
         * @param dep
         * @param arr
         * @return Le créneau (n')est (pas) libre
         */
        public Boolean isFreeAt(Heure dep, Heure arr) {
        	Boolean res=true;
        	for(VolInstance current : listeVol) {
        		Heure heureDepart = new Heure(current.getHeureDepart());
        		Heure heureArrivee = new Heure(current.getHeureArrivee());
        		heureArrivee.addMinute(30);
        		Heure arrivee = new Heure(arr);
        		arrivee.addMinute(30);
        		boolean res1=(dep.compareTo(heureArrivee) > 0);
        		boolean res2=(dep.compareTo(heureArrivee) < 0);
        		boolean res3=(arrivee.compareTo(heureDepart) < 0);
        		res = res && (res1 || (res2 && res3));
        	}
        	return res;
        }
        
        public Airport positionAt(Heure heure) {
        	Heure h = new Heure(heure);
        	for(VolInstance current : listeVol) {
        		Heure heureArrivee = new Heure(current.getHeureArrivee());
        		heureArrivee.addMinute(30);
        		if(h.compareTo(heureArrivee) < 0) continue;
        		else {
        			return current.getArrivee();
        		}
        	}
        	return null;
        }
        
        public void removeVol(int i) {
        	listeVol.remove(i);
        }
        
        public VolInstance nextVol() {
        	return listeVol.get(0);
        }

		/**
		 * @return the listeVol
		 */
		public ArrayList<VolInstance> getListeVol() {
			return listeVol;
		}
        
        
        
}
